package dmon;


import dmon.ControlDmon;
import dmon.ErrorHandler;
import dmon.Promtp;
import dmon.ServerConnection;



/**
 * Universidad Simón Bolívar
 * Curso de Redes I - Taller
 * Profesor: Ricardo Gonzalez
 * Trimestre Enero-Marzo 2011
 *
 * Proyecto 2 RD
 * Se desea implementar un sistema de repositorios de archivos, que llamaremos
 * Repositorios Distribuidos o RD, estos repositorios estarán constituidos por
 * tres tipos de componentes diferentes: uno de ellos será un programa que
 * llamaremos drep que se encargará de recibir, almacenar y entregar archivos
 * que sea subidos o solicitados por otros programas, los componentes dcli
 * serán programas que enviarán o solicitarán archivos a los programas drep del
 * sistema, en función de los requerimientos de los usuarios con los que
 * interactúan en su pantalla. Pueden existir varias instancias de programas
 * drep y de programas dcli en el sistema, pero debe existir una única instancia
 * del programa dmon, este último componente se encargará de llevar una serie de
 * datos de las operaciones que los programas dcli realizan en todos los
 * programas drep del sistema.
 *
 * Programa dmon
 * Es un programa monitor que debe recibir o recolectar información de los
 * diferentes programas drep que existan en el sistema, esta información debe
 * reflejar cada una de las operaciones que un programa dcli solicite a un
 * programa drep del sistema. Con la información recolectada el progrmaa dmon
 * podrá responder a solicitudes de información que provengan originalmente
 * de un programa dcli y que lleguen a él a través de un progrma drep.
 *
 * La sintaxis de la llamada a este programa será la siguiente:
 * dmon [-p <puerto local del monitor>]
 *
 * @author Grupo 9
 * @author Richard Simoes Ferreira
 * @author Ricardo Tocco
 *
 * @version 1.0
 */

public class Main {

    /**
     * Función para capturar y verificar los parámetro introdcidos por el
     * usuario.
     *
     * @param args  lista de los parámetros de entrada
     * @return      Un apuntador a la estructura de control ControlDmon
     *              que agrupa toda la información necesaria para la correcta
     *              ejecución de los programas dmon.
     */
    private static ControlDmon capturarParametros(String[] args){

        ErrorHandler errorH = new ErrorHandler();
        //Defaults
        int puerto = 16000;

        ControlDmon control;


        if (args.length != 2) {
            errorH.argumentosInvalidos();
        } else {

            if (args[0].equals("-p")) {
                puerto = Integer.valueOf(args[1]);
                if (puerto <= 1024 && puerto >= 65535)
                    errorH.puertoInvalido(puerto);
            } else {
                errorH.parametroInvalido();
            }

        }

        control = new ControlDmon(puerto);
        return control;
    }

    /**
     * Función Principal para el programa dmon.
     *
     * @param args  lista de los parámetros de entrada
     * @return      0 si la ejecución es exitosa o cualquier otro valor en
     *              caso de error.
     */
    public static void main(String[] args) {
        
        ControlDmon control;
        ServerConnection server;
        Promtp promtp;

        control = capturarParametros(args);

        server = new ServerConnection(control.getPuertoDrep(),control);
        promtp = new Promtp(control);

        server.start();
        promtp.run();

        server.terminar();
        System.exit(0);

    }

}
